<?php

class Publico extends CI_Controller {

    function __construct() {
        parent::__construct();
        $this->load->model('mcontroles');
        $this->load->model('msalidas');
        $this->load->model('mparaderos');
        $this->load->model('mtransporte');
        $this->load->model('mcelulares');
        $this->load->library('funciones');
    }

    function index() {
        $this->load->view('portada');
        //echo nada
    }

    function marcacionCelular() {
        $ninicio = microtime(true);
        $tipoPantalla = 0;
        $casoCorrida = 0;

        $url = "http://hatunsoft.com/chasqui/index.php/publico/marcacionCelular";
        $url.="?latitud=" . $_GET['latitud'];
        $url.="&longitud=" . $_GET['longitud'];
        $url.="&horaCelular=" . $_GET['horaCelular'];
        $url.="&cell=" . $_GET['cell'];
        $url.="&isvalido" . $_GET['isvalido'];
        $url.="&info" . $_GET['info'];

        $longitud = $_GET['longitud'];
        $latitud = $_GET['latitud'];
        $horaCelular = $_GET['horaCelular'];
        $celular = $_GET['cell'];
        if (isset($_GET['info'])) {
            $informacionExtra = $_GET['info'];
        } else {
            $informacionExtra = 'null';
        }
        if (isset($_GET['isvalido'])) {
            $iValido = $_GET['isvalido'];
        } else {
            $iValido = '0';
        }
        if($latitud==''){
            $iValido = '0';
            
        }else{
            $iValido = '1';
        }
        if(isset($_GET['horaActual'])){
            $horaActual=$_GET['horaActual'];
            //echo "unix: $horaActual <br>";
        } else {
            //$horaActual=$_GET['horaActual'];
            $horaActual = microtime(true);
        }
        // echo "hora actual: ".date("d m y H:i:s",$horaActual)."<br/>";
        $estadoSalida = 0;
        $estado = 0;
        $paraderoInicial = '';
        $paradero2 = '';
        $horaMostrar = '';
        $distanciaMostrar = '';
        //grabamos en mmarcacion
        $data['placa'] = '';
        $data['nparadero'] = '';
        $data['horaControl'] = '';
        $data['distanciaRecorrida'] = '';
        $data["id"] = $this->mcontroles->insertaMarcacion($latitud, $longitud, $horaCelular, $celular, $informacionExtra, $iValido, $horaActual);
        $idmmarcacion = $data["id"];

        $estadoSonido = 0;
        if ($iValido == 1) {   // si es buena senhal calculamors verificamos si esta en ruta
            $arrayProgramacionSalida = $this->msalidas->salidasxcelular($celular);
            $estadoSalida = 0; // determina si tiene salidas

            if (count($arrayProgramacionSalida) == 0) { // si no hay porgramacion
                $arrayEnRuta = $this->verificarRuta($celular);
                if ($arrayEnRuta['estadoEnRuta'] == 1) {
                    $estadoSalida = 1;
                    /////// insertando programacion de salidas
                    $fecha = date("Y-m-d H:i:s", $arrayEnRuta['tiempoParaderoInicial']);
                    $datoSalida['dhora_salida'] = $fecha;
                    $datoSalida['dhora_llegada'] = '';
                    $datoSalida['iddtransporte_linea'] = $arrayEnRuta['iddtransporte_linea'];
                    // $datos['iddempleo_persona_chofer'] = 1;
                    //$datos['iddempleo_persona_cobrador'] = 1;
                    $datoSalida['iddparaderos_inicial'] = $arrayEnRuta['paraderoInicial'];
                    $datoSalida['iddparaderos_final'] = $arrayEnRuta['paradero2'];
                    $datoSalida['idmcelulares'] = $arrayEnRuta['idmcelulares'];
                    $datoSalida['idmruta'] = $arrayEnRuta['ruta'];
                    $datoSalida['iestado'] = 1;
                    $datoSalida['idusuario'] = 1;
                    $datoSalida['vhost'] = $_SERVER['REMOTE_ADDR'];
                    $idSalida = $this->msalidas->insertarSalidas($datoSalida);
                    $data['idmProgramacionSalidas'] = $idSalida;
                    $idProgramacionSalida = $idSalida;
                    $arrayPuntos = $arrayEnRuta['arrayPuntos'];
                    //insertando mrcaciones de puntos de paso
                    //buscando paraderos de puntos de paso anteriores
                    // $paraderosPasados = $this->mparaderos->rangoParaderos($arrayEnRuta['paraderoInicial'], $arrayEnRuta['paradero1']);
                    $paraderosPasados = $this->mparaderos->paraderosAnteriores($arrayEnRuta['paradero1']);
                    $numeroParaderosPasados = count($paraderosPasados);
//                    echo "paraderosPasados<br/>";
//                    print_r($paraderosPasados);
//                    echo "<br/>";
                    $sumaDistancia = 0;
                    $distanciaToParadero = $this->mparaderos->sumaDistancias($arrayEnRuta['paradero1']);
                    foreach ($paraderosPasados as $key => $value) {
                        if (isset($paraderosPasados[$key + 1]['iddparaderos'])) {
                            $datosInsertar['iddparaderos'] = $paraderosPasados[$key + 1]['iddparaderos'];
                        } else {

                            $datosInsertar['iddparaderos'] = $value['iddparaderos'];
                        }


                        $datosInsertar['iddparaderos1'] = $value['iddparaderos'];
                        $datosInsertar['idmProgramacionSalidas'] = $idSalida;
                        $datosInsertar['iestado'] = 2;  //cerrado
                        //////hallando los tiempos////
                        if ($key == 0) {
                            $datosInsertar['dHoraControl'] = $arrayEnRuta['tiempoParadero1'];
//                        } elseif ($key == ($numeroParaderosPasados - 1)) {
//                            $datosInsertar['dHoraControl'] = $arrayEnRuta['tiempoParaderoInicial'];
                        } else {
                            $datosInsertar['dHoraControl'] = $arrayEnRuta['tiempoParadero1'] - $sumaDistancia / $arrayEnRuta['velocidad'];
                        }
                        $datosInsertar['dHoraControl1'] = $datosInsertar['dHoraControl'];
                        $datosInsertar['dHoraControl2'] = $datosInsertar['dHoraControl'];
                        $datosInsertar['dHoraControl3'] = $datosInsertar['dHoraControl'];
                        $datosInsertar['dHoraControl4'] = $datosInsertar['dHoraControl'];
                        $datosInsertar['dHoraControl5'] = $datosInsertar['dHoraControl'];
                        $datosInsertar['ngps_latitud1'] = $value['ngps_latitud1'];
                        $datosInsertar['ngps_longitud1'] = $value['ngps_longitud1'];
                        $datosInsertar['ngps_latitudPromedio'] = $value['ngps_latitud1'];
                        $datosInsertar['ngps_longitudPromedio'] = $value['ngps_longitud1'];
                        $datosInsertar['ndistanciaUltimoParadero'] = $distanciaToParadero - $sumaDistancia;
                        $sumaDistancia = $sumaDistancia + $value['ndistanciaParadero'];
                        $datosInsertar['ndistanciaParaderoInicial'] = $distanciaToParadero - $sumaDistancia;
                        $datosInsertar['dhoracontrolanterior'] = 0; // reemplazar por la hora fecha de salida
                        $datosInsertar['iTipoMarcacion'] = 2; ///proyectado
                        $idMarcacionControl = $this->mcontroles->insertaContrlInicial($datosInsertar);
                    }


                    ////////////////////////////
                    ////////insertando puntos final
                    $datosInsertar['iddparaderos'] = $arrayEnRuta['paradero1'];

                    $datosInsertar['iddparaderos1'] = $arrayEnRuta['paradero2'];
                    $datosInsertar['idmProgramacionSalidas'] = $idSalida;
                    $datosInsertar['iestado'] = 1;  //cerrado
                    //////hallando los tiempos////
                    $datosInsertar['dHoraControl'] = 0;


                    $datosInsertar['dHoraControl1'] = $arrayEnRuta['arrayTiempos'][0];
                    $datosInsertar['dHoraControl2'] = $arrayEnRuta['arrayTiempos'][1];
                    $datosInsertar['dHoraControl3'] = $arrayEnRuta['arrayTiempos'][2];
                    $datosInsertar['dHoraControl4'] = $arrayEnRuta['arrayTiempos'][3];
                    $datosInsertar['dHoraControl5'] = $arrayEnRuta['arrayTiempos'][4];
                    $arrayPuntos = $arrayEnRuta['arrayPuntos'];


                    $datosInsertar['idmmarcacionOriginal'] = $arrayPuntos[0]['idmmarcacionOriginal'];
                    $datosInsertar['idmmarcacionOriginal1'] = $arrayPuntos[1]['idmmarcacionOriginal'];
                    $datosInsertar['idmmarcacionOriginal2'] = $arrayPuntos[2]['idmmarcacionOriginal'];
                    $datosInsertar['idmmarcacionOriginal3'] = $arrayPuntos[3]['idmmarcacionOriginal'];
                    $datosInsertar['idmmarcacionOriginal4'] = $arrayPuntos[4]['idmmarcacionOriginal'];


                    $datosInsertar['ngps_latitud1'] = $arrayPuntos[0]['ngps_latitud'];
                    $datosInsertar['ngps_longitud1'] = $arrayPuntos[0]['ngps_longitud'];
                    $datosInsertar['ngps_latitud2'] = $arrayPuntos[1]['ngps_latitud'];
                    $datosInsertar['ngps_longitud2'] = $arrayPuntos[1]['ngps_longitud'];
                    $datosInsertar['ngps_latitud3'] = $arrayPuntos[2]['ngps_latitud'];
                    $datosInsertar['ngps_longitud3'] = $arrayPuntos[2]['ngps_longitud'];
                    $datosInsertar['ngps_latitud4'] = $arrayPuntos[3]['ngps_latitud'];
                    $datosInsertar['ngps_longitud4'] = $arrayPuntos[3]['ngps_longitud'];
                    $datosInsertar['ngps_latitud5'] = $arrayPuntos[4]['ngps_latitud'];
                    $datosInsertar['ngps_longitud5'] = $arrayPuntos[4]['ngps_longitud'];

                    $arrayDistancias = $arrayEnRuta['arrayDistancias'];
                    $datosInsertar['ndistancia1'] = $arrayDistancias[0];
                    $datosInsertar['ndistancia2'] = $arrayDistancias[1];
                    $datosInsertar['ndistancia3'] = $arrayDistancias[2];
                    $datosInsertar['ndistancia4'] = $arrayDistancias[3];
                    $datosInsertar['ndistancia5'] = $arrayDistancias[4];


                    $datosInsertar['iestadoDiferencia1'] = -1;
                    $datosInsertar['iestadoDiferencia2'] = -1;
                    $datosInsertar['iestadoDiferencia3'] = -1;
                    $datosInsertar['iestadoDiferencia4'] = -1;
                    $datosInsertar['iestadoDiferencia5'] = -1;

                    $datosInsertar['ngps_latitudPromedio'] = 0;
                    $datosInsertar['ngps_longitudPromedio'] = 0;
                    $datosInsertar['ndistanciaUltimoParadero'] = $distanciaToParadero + $arrayEnRuta['distanciaP1Punto'];

                    $datosInsertar['ndistanciaParaderoInicial'] = $distanciaToParadero;
                    $datosInsertar['dhoracontrolanterior'] = $arrayEnRuta['tiempoParadero1']; // reemplazar por la hora fecha de salida
                    $datosInsertar['iTipoMarcacion'] = 1; //no proyectado
                    $idMarcacionControl = $this->mcontroles->insertaContrlInicial($datosInsertar);
                    $tipoPantalla = 1;

                    ////datos relevantes///
                    $paradero1 = $arrayEnRuta['paradero1'];
                    $paradero2 = $arrayEnRuta['paradero2'];
                    $tipoPantalla = 3;
                    $casoCorrida = 1;
                    //////////////////////////
                    ///////////////////////
                } else {// no se encontro ruta
                    $tipoPantalla = 2;
                    $tipoPantalla = 1;
                    $casoCorrida = 2;
                }
            } else {
                /// tiene programación activa
                $idProgramacionSalida = $arrayProgramacionSalida[0]['idmProgramacionSalidas'];
                $arrayControlInicial = $this->mcontroles->controlInicialxSalida($idProgramacionSalida);
                if (count($arrayControlInicial) == 0) {
                    // no tiene registro de controles para esta salida
                    $arrayHoraSalida = $arrayProgramacionSalida[0]['horaSalida'];
                    $arrayHoraSalida = explode("/", $arrayHoraSalida);
                    $horaSalida = mktime($arrayHoraSalida[3], $arrayHoraSalida[4], $arrayHoraSalida[5], $arrayHoraSalida[1], $arrayHoraSalida[0], $arrayHoraSalida[2]);
                    if ($horaActual >= $horaSalida) {
                        /// si es hora actual
                        $tolerancia = "00:10:00"; //equivalene a 20 min ,
                        $numeroPuntos = 5;
                        $arrayPuntos = $this->mcontroles->getPuntosAnteriores($celular, $numeroPuntos, $tolerancia);
                        $idmruta = $arrayProgramacionSalida[0]['idmruta'];
                        if (count($arrayPuntos) == $numeroPuntos) {
                            $arrayRecorrido = $this->hallarRuta($arrayPuntos, $celular, $idmruta, 0);
                        } else {
                            $arrayRecorrido['estadoEnRuta'] = 0;
                        }

                        if ($arrayRecorrido['estadoEnRuta'] == 1) {
                            //// la ruta fue localizada
                            //// grabando los controles calculados
                            $paraderosPasados = $this->mparaderos->paraderosAnteriores($arrayRecorrido['paradero1']);
                            $numeroParaderosPasados = count($paraderosPasados);
                            $sumaDistancia = 0;
                            $distanciaToParadero = $this->mparaderos->sumaDistancias($arrayRecorrido['paradero1']);
                            foreach ($paraderosPasados as $key => $value) {
                                if (isset($paraderosPasados[$key + 1]['iddparaderos'])) {
                                    $datosInsertar['iddparaderos'] = $paraderosPasados[$key + 1]['iddparaderos'];
                                } else {
                                    $datosInsertar['iddparaderos'] = $value['iddparaderos'];
                                }
                                $datosInsertar['iddparaderos1'] = $value['iddparaderos'];
                                $datosInsertar['idmProgramacionSalidas'] = $idProgramacionSalida;
                                $datosInsertar['iestado'] = 2;  //cerrado
                                //////hallando los tiempos////
                                if ($key == 0) {
                                    $datosInsertar['dHoraControl'] = $arrayRecorrido['tiempoParadero1'];
//                                } elseif ($key == ($numeroParaderosPasados - 1)) {
//                                    $datosInsertar['dHoraControl'] = $arrayRecorrido['tiempoParaderoInicial'];
                                } else {
                                    $datosInsertar['dHoraControl'] = $arrayRecorrido['tiempoParadero1'] - $sumaDistancia / $arrayRecorrido['velocidad'];
                                }
                                $datosInsertar['dHoraControl1'] = $datosInsertar['dHoraControl'];
                                $datosInsertar['dHoraControl2'] = $datosInsertar['dHoraControl'];
                                $datosInsertar['dHoraControl3'] = $datosInsertar['dHoraControl'];
                                $datosInsertar['dHoraControl4'] = $datosInsertar['dHoraControl'];
                                $datosInsertar['dHoraControl5'] = $datosInsertar['dHoraControl'];
                                $datosInsertar['ngps_latitud1'] = $value['ngps_latitud1'];
                                $datosInsertar['ngps_longitud1'] = $value['ngps_longitud1'];
                                $datosInsertar['ngps_latitudPromedio'] = $value['ngps_latitud1'];
                                $datosInsertar['ngps_longitudPromedio'] = $value['ngps_longitud1'];
                                $datosInsertar['ndistanciaUltimoParadero'] = $distanciaToParadero - $sumaDistancia;
                                $sumaDistancia = $sumaDistancia + $value['ndistanciaParadero'];
                                $datosInsertar['ndistanciaParaderoInicial'] = $distanciaToParadero - $sumaDistancia;
                                $datosInsertar['dhoracontrolanterior'] = 0; // reemplazar por la hora fecha de salida
                                $datosInsertar['iTipoMarcacion'] = 2; ///proyectado
                                $idMarcacionControl = $this->mcontroles->insertaContrlInicial($datosInsertar);
                            }

                            //gravando control en curso
                            //////////////////////////////
                            $datosInsertar['iddparaderos'] = $arrayRecorrido['paradero1'];
                            $datosInsertar['iddparaderos1'] = $arrayRecorrido['paradero2'];


                            $datosInsertar['idmProgramacionSalidas'] = $idProgramacionSalida;
                            $datosInsertar['iestado'] = 1;  //cerrado
                            //////hallando los tiempos////
                            $datosInsertar['dHoraControl'] = 0;


                            $datosInsertar['dHoraControl1'] = $arrayRecorrido['arrayTiempos'][0];
                            $datosInsertar['dHoraControl2'] = $arrayRecorrido['arrayTiempos'][1];
                            $datosInsertar['dHoraControl3'] = $arrayRecorrido['arrayTiempos'][2];
                            $datosInsertar['dHoraControl4'] = $arrayRecorrido['arrayTiempos'][3];
                            $datosInsertar['dHoraControl5'] = $arrayRecorrido['arrayTiempos'][4];



                            $datosInsertar['idmmarcacionOriginal'] = $arrayPuntos[0]['idmmarcacionOriginal'];
                            $datosInsertar['idmmarcacionOriginal1'] = $arrayPuntos[1]['idmmarcacionOriginal'];
                            $datosInsertar['idmmarcacionOriginal2'] = $arrayPuntos[2]['idmmarcacionOriginal'];
                            $datosInsertar['idmmarcacionOriginal3'] = $arrayPuntos[3]['idmmarcacionOriginal'];
                            $datosInsertar['idmmarcacionOriginal4'] = $arrayPuntos[4]['idmmarcacionOriginal'];


                            $datosInsertar['ngps_latitud1'] = $arrayPuntos[0]['ngps_latitud'];
                            $datosInsertar['ngps_longitud1'] = $arrayPuntos[0]['ngps_longitud'];
                            $datosInsertar['ngps_latitud2'] = $arrayPuntos[1]['ngps_latitud'];
                            $datosInsertar['ngps_longitud2'] = $arrayPuntos[1]['ngps_longitud'];
                            $datosInsertar['ngps_latitud3'] = $arrayPuntos[2]['ngps_latitud'];
                            $datosInsertar['ngps_longitud3'] = $arrayPuntos[2]['ngps_longitud'];
                            $datosInsertar['ngps_latitud4'] = $arrayPuntos[3]['ngps_latitud'];
                            $datosInsertar['ngps_longitud4'] = $arrayPuntos[3]['ngps_longitud'];
                            $datosInsertar['ngps_latitud5'] = $arrayPuntos[4]['ngps_latitud'];
                            $datosInsertar['ngps_longitud5'] = $arrayPuntos[4]['ngps_longitud'];

                            $arrayDistancias = $arrayRecorrido['arrayDistancias'];
                            $datosInsertar['ndistancia1'] = $arrayDistancias[0];
                            $datosInsertar['ndistancia2'] = $arrayDistancias[1];
                            $datosInsertar['ndistancia3'] = $arrayDistancias[2];
                            $datosInsertar['ndistancia4'] = $arrayDistancias[3];
                            $datosInsertar['ndistancia5'] = $arrayDistancias[4];


                            $datosInsertar['iestadoDiferencia1'] = -1;
                            $datosInsertar['iestadoDiferencia2'] = -1;
                            $datosInsertar['iestadoDiferencia3'] = -1;
                            $datosInsertar['iestadoDiferencia4'] = -1;
                            $datosInsertar['iestadoDiferencia5'] = -1;

                            $datosInsertar['ngps_latitudPromedio'] = 0;
                            $datosInsertar['ngps_longitudPromedio'] = 0;
                            $datosInsertar['ndistanciaUltimoParadero'] = $distanciaToParadero + $arrayRecorrido['distanciaP1Punto'];

                            $datosInsertar['ndistanciaParaderoInicial'] = $distanciaToParadero;
                            $datosInsertar['dhoracontrolanterior'] = $arrayRecorrido['tiempoParadero1']; // reemplazar por la hora fecha de salida
                            $datosInsertar['iTipoMarcacion'] = 1; //no proyectado
                            $idMarcacionControl = $this->mcontroles->insertaContrlInicial($datosInsertar);

                            //////////////fin de gravando control en curso/////////
                            ////////////////////////////////////
                            $tipoPantalla = 3;
                            $casoCorrida = 3;
                            $paradero1 = $arrayRecorrido['paradero1'];
                            $paradero2 = $arrayRecorrido['paradero2'];
                        } else {
                            //// la ruta no fue localizada.
                            //$tipoPantalla = 2;
                            $casoCorrida = 4;
                        }
                    } else {
                        /////aun no en hora
                        $tipoPantalla = 2;
                        $casoCorrida = 5;
                    }
                } else {
                    // si tiene registro de controles para esta salida
                    ////////////verificamos si viene de buena senhal de mala senhal
                    $arrayControl = $this->mcontroles->controlxsalida($idProgramacionSalida);
                    if ($arrayControl[0]['iTipoMarcacion'] == 1) {
                        //con buena senhal
                        //$arrayControl = $this->mcontroles->controlxsalida($idProgramacionSalida);
                        if (count($arrayControl) == 0) {
                            ////sin control activo
                        } else {
                            //// con control activo
                            //actualizar carro en curso de paradero 1 a 2
                            $longitudPromedio = $longitud;
                            $latitudPromedio = $latitud;
                            $numeroCoordenadas = 1;

                            if ($arrayControl[0]['ngps_latitud1'] != '') {
                                $longitudPromedio = $longitudPromedio + $arrayControl[0]['ngps_longitud1'];
                                $latitudPromedio = $latitudPromedio + $arrayControl[0]['ngps_latitud1'];
                                $numeroCoordenadas++;
                            }
                            if ($arrayControl[0]['ngps_latitud2'] != '') {
                                $longitudPromedio = $longitudPromedio + $arrayControl[0]['ngps_longitud2'];
                                $latitudPromedio = $latitudPromedio + $arrayControl[0]['ngps_latitud2'];
                                $numeroCoordenadas++;
                            }
                            if ($arrayControl[0]['ngps_latitud3'] != '') {
                                $longitudPromedio = $longitudPromedio + $arrayControl[0]['ngps_longitud3'];
                                $latitudPromedio = $latitudPromedio + $arrayControl[0]['ngps_latitud3'];
                                $numeroCoordenadas++;
                            }
                            if ($arrayControl[0]['ngps_latitud4'] != '') {
                                $longitudPromedio = $longitudPromedio + $arrayControl[0]['ngps_longitud4'];
                                $latitudPromedio = $latitudPromedio + $arrayControl[0]['ngps_latitud4'];
                                $numeroCoordenadas++;
                            }
                            $longitudPromedio = $longitudPromedio / $numeroCoordenadas;
                            $latitudPromedio = $latitudPromedio / $numeroCoordenadas;

                            $paraderoInicial = $arrayControl[0]['iddparaderos'];
                            $paradero2 = $arrayControl[0]['iddparaderos1'];
//
                            $distanciaNueva = $this->distanciaCoordenadaParadero($latitud, $longitud, $paradero2);
                            ;
                            $iestadoDiferenciaNueava = 0;
                            $diferencia = $distanciaNueva - $arrayControl[0]['ndistancia1'];
                            if ($diferencia < 0) {
                                $iestadoDiferenciaNueava = -1;
                            }
                            if ($diferencia > 0) {
                                $iestadoDiferenciaNueava = 1;
                            }
                            if ($diferencia < 0.000001) {
                                $iestadoDiferenciaNueava = 0;
                                // echo "diferencia minima:$diferencia <br/>";
                            }
//                    //echo "Diferencia: $diferencia <br/>";
                            $e1 = $iestadoDiferenciaNueava;
                            $e2 = $arrayControl[0]['iestadoDiferencia1'];
                            $e3 = $arrayControl[0]['iestadoDiferencia2'];
                            $e4 = $arrayControl[0]['iestadoDiferencia3'];
                            $e5 = $arrayControl[0]['iestadoDiferencia4'];
                            $e6 = $arrayControl[0]['iestadoDiferencia5'];
                            $idMarcacionControl = $arrayControl[0]['idmmarcacion_control'];
//
                            $datosCruce['e1'] = $iestadoDiferenciaNueava;
                            $datosCruce['e2'] = $e2;
                            $datosCruce['e3'] = $e3;
                            $datosCruce['e4'] = $e4;
                            $datosCruce['e5'] = $e5;
                            $datosCruce['e6'] = $e6;
                            $datosCruce['latitud'] = $latitud;
                            $datosCruce['longitud'] = $longitud;
                            $datosCruce['latitud1'] = $arrayControl[0]['ngps_latitud1'];
                            $datosCruce['longitud1'] = $arrayControl[0]['ngps_longitud1'];
                            $datosCruce['latitud2'] = $arrayControl[0]['ngps_latitud2'];
                            $datosCruce['longitud2'] = $arrayControl[0]['ngps_longitud2'];
                            $datosCruce['latitud3'] = $arrayControl[0]['ngps_latitud3'];
                            $datosCruce['longitud3'] = $arrayControl[0]['ngps_longitud3'];
                            $datosCruce['latitud4'] = $arrayControl[0]['ngps_latitud4'];
                            $datosCruce['longitud4'] = $arrayControl[0]['ngps_longitud4'];
                            $datosCruce['latitud5'] = $arrayControl[0]['ngps_latitud5'];
                            $datosCruce['longitud5'] = $arrayControl[0]['ngps_longitud5'];
                            $datosCruce['latitudPromedio'] = $latitudPromedio;
                            $datosCruce['longitudPromedio'] = $longitudPromedio;
                            $datosCruce['paradero1'] = $paraderoInicial;
                            $datosCruce['paradero2'] = $paradero2;
                            $estadoCruce = $this->cruzaParaderoEstados($datosCruce);
//                    ////

                            $dHoraControl = 0;
                            $dHoraControl1 = $horaActual;
                            $ditanciaReal = 0;
                            if ($estadoCruce['cruce'] == 2) {
                                $tiempoDistancias = $this->mcontroles->controlxsalidaDatos($idProgramacionSalida);
                                //print_r($tiempoDistancias);
                                $diferenciaTiempo = $tiempoDistancias[0]['dHoraControl1'] - $tiempoDistancias[0]['dHoraControl3'];
                                $d3 = $tiempoDistancias[0]['ndistancia3'];
                                $d1 = $tiempoDistancias[0]['ndistancia1'];
                                $dHoraControl = $d3 * $diferenciaTiempo;
                                $dHoraControl = $dHoraControl / ($d3 + $d1);
                                if ($dHoraControl < 0) {
                                    //echo "menor que cero";
                                    // echo "horatiempo=$dHoraControl";
                                }

                                $dHoraControl = $dHoraControl + $tiempoDistancias[0]['dHoraControl3'];
                                $ditanciaReal = $this->distanciaRealParaderos($paraderoInicial, $paradero2);
                                $ditanciaReal = $ditanciaReal + $arrayControl[0]['ndistanciaParaderoInicial'];
                                // $dHoraControl=$tiempoDistancias[0]['dHoraControl3']+$d3*$diferenciaTiempo/($d3+$d1);
                            } else {
                                $horaMostrar = $arrayControl[0]["dhoracontrolanterior"];
                                $ditanciaReal = $arrayControl[0]['ndistanciaParaderoInicial'] + $this->distanciaRealParaderoCoordenadas($paraderoInicial, $latitud, $longitud);
                            }

//
                            $datosActualizacion['idMarcacionControl'] = $idMarcacionControl;
                            $datosActualizacion['idmmarcacion'] = $idmmarcacion;
                            $datosActualizacion['estadoCruce'] = $estadoCruce['cruce'];
                            $datosActualizacion['distanciaNueva'] = $distanciaNueva;
                            $datosActualizacion['e1'] = $e1;
                            $datosActualizacion['dHoraControl'] = $dHoraControl;
                            $datosActualizacion['dHoraControl1'] = $dHoraControl1;
                            $datosActualizacion['ditanciaReal'] = $ditanciaReal;
                            $datosActualizacion['longitud'] = $longitud;
                            $datosActualizacion['latitud'] = $latitud;
                            $datosActualizacion['longitudPromedio'] = $longitudPromedio;
                            $datosActualizacion['latitudPromedio'] = $latitudPromedio;
                            if ($estadoCruce['valido'] == 2 && $estadoCruce['cruce'] == 1) {
                                $datosActualizacion['iTipoMarcacion'] = 2; //mala se;al
                                //echo "<br/>mala se;al ";
                                $casoCorrida = 9;
                            } else {
                                $datosActualizacion['iTipoMarcacion'] = 1; //buena se;al
                                //  echo "<br/>buena se;al ";
                                $casoCorrida = 8;
                            }
//
//
                            $this->mcontroles->actualizaControl($datosActualizacion);
//
//                    ////////////////insertando nuevo control///////////////
//                    //nuevo paradero
                            if ($estadoCruce['cruce'] == 2) {
                                $paraderoInicial = $this->mparaderos->siguienteParadero($paraderoInicial);
                                $paradero2 = $this->mparaderos->siguienteParadero($paraderoInicial);
                                if ($paradero2 == 0) {

                                    $respuesta = $this->msalidas->cancelarSalida($idProgramacionSalida);
                                    $estadoSalida = 0;
                                    $data['dHoraControl'] = $dHoraControl;
                                    $casoCorrida = 6;
                                } else {
                                    $datosInsertar['iddparaderos'] = $paraderoInicial;
                                    $datosInsertar['iddparaderos1'] = $paradero2;
                                    ///////////////////

                                    $datosInsertar['idmProgramacionSalidas'] = $idProgramacionSalida;
                                    $datosInsertar['idmmarcacionOriginal'] = $idmmarcacion;
                                    $datosInsertar['idmmarcacionOriginal1'] = $idmmarcacion;
                                    $datosInsertar['idmmarcacionOriginal2'] = $idmmarcacion;
                                    $datosInsertar['idmmarcacionOriginal3'] = $idmmarcacion;
                                    $datosInsertar['idmmarcacionOriginal4'] = $idmmarcacion;
                                    $datosInsertar['iestado'] = 1;
                                    $datosInsertar['ndistancia1'] = $this->distanciaCoordenadaParadero($latitud, $longitud, $paradero2);
                                    $datosInsertar['ndistancia2'] = $this->distanciaParaderos($paraderoInicial, $paradero2);
                                    $datosInsertar['ndistancia3'] = $datosInsertar['ndistancia2'];
                                    $datosInsertar['ndistancia4'] = $datosInsertar['ndistancia2'];
                                    $datosInsertar['ndistancia5'] = $datosInsertar['ndistancia2'];
                                    $datosInsertar['dHoraControl'] = $dHoraControl1;
                                    $datosInsertar['dHoraControl1'] = $datosInsertar['dHoraControl'];
                                    $datosInsertar['dHoraControl2'] = $datosInsertar['dHoraControl'];
                                    $datosInsertar['dHoraControl3'] = $datosInsertar['dHoraControl'];
                                    $datosInsertar['dHoraControl4'] = $datosInsertar['dHoraControl'];
                                    $datosInsertar['dHoraControl5'] = $datosInsertar['dHoraControl'];
                                    $datosInsertar['ngps_latitud1'] = $latitud;
                                    $datosInsertar['ngps_longitud1'] = $longitud;
                                    $datosInsertar['ngps_latitudPromedio'] = $latitud;
                                    $datosInsertar['ngps_longitudPromedio'] = $longitud;
                                    $datosInsertar['iestadoDiferencia1'] = -1;
                                    $datosInsertar['iestadoDiferencia2'] = 0;
                                    $datosInsertar['iestadoDiferencia3'] = 0;
                                    $datosInsertar['iestadoDiferencia4'] = 0;
                                    $datosInsertar['iestadoDiferencia5'] = 0;
                                    $datosInsertar['ndistanciaParaderoInicial'] = $ditanciaReal;
                                    ///
                                    $ditanciaReal = $ditanciaReal + $this->distanciaRealParaderoCoordenadas($paraderoInicial, $latitud, $longitud);
                                    $datosInsertar['ndistanciaUltimoParadero'] = $this->distanciaRealParaderoCoordenadas($paraderoInicial, $latitud, $longitud) + $ditanciaReal;
                                    //$datosInsertar['ndistanciaUltimoParadero'] = $datosInsertar['ndistanciaUltimoParadero'] + $arrayControlInicial[0]['ndistanciaUltimoParadero'];

                                    $datosInsertar['dhoracontrolanterior'] = $dHoraControl;
                                    $idMarcacionControl = $this->mcontroles->insertaContrlInicial($datosInsertar);
                                    //////
                                    $estado = 1;
                                    /////
                                    $horaMostrar = $dHoraControl;
                                    $casoCorrida = 7;
                                }

                                $paradero1 = $paraderoInicial;
                                $paradero2 = $paradero2;
                            } else {

                                $paradero1 = $paraderoInicial;
                                $paradero2 = $paradero2;
                            }
                        }
                    } else {
                        // con mala senhal, se busca donde esta el recorrido
                        $tolerancia = "00:10:00"; //equivalene a 20 min ,
                        $numeroPuntos = 5;
                        $idParadero = $arrayControl[0]['iddparaderos'];
                        $idmruta = $arrayProgramacionSalida[0]['idmruta'];

                        $arrayPuntos = $this->mcontroles->getPuntosAnteriores($celular, $numeroPuntos, $tolerancia);
//                        if (count($arrayPuntos) == 5) {
//                            $arrayRecorrido = $this->hallarRuta($arrayPuntos, $celular, $idmruta, $idParadero);
//                        } else {
//                            $arrayRecorrido['estadoEnRuta'] = 0;
//                        }
                        $arrayRecorrido = $this->determinaRuta($idParadero, $celular, $latitud, $longitud);
                        if ($arrayRecorrido['estadoEnRuta'] == 1) {
                            //// la ruta fue localizada
                            //// grabando los controles calculados
                            $paraderosPasados = $this->mparaderos->rangoParaderos($idParadero, $arrayRecorrido['paradero1']);
                            $numeroParaderosPasados = count($paraderosPasados);
                            $sumaDistancia = 0;
                            $distanciaToParadero = $this->mparaderos->sumaDistancias($arrayRecorrido['paradero1']);

                            //gravando control en curso
                            //////////////////////////////
                            if ($idParadero == $arrayRecorrido['paradero1']) {
                                // se actualiza

                                $datosActulizar['idmmarcacion_control'] = $arrayControl[0]['idmmarcacion_control'];
                                $datosActulizar['dHoraControl1'] = $horaActual;
                                $datosActulizar['dHoraControl2'] = $horaActual;
                                $datosActulizar['dHoraControl3'] = $horaActual;
                                $datosActulizar['dHoraControl4'] = $horaActual;
                                $datosActulizar['dHoraControl5'] = $horaActual;

                                $datosActulizar['idmmarcacionOriginal'] = $idmmarcacion;
                                $datosActulizar['idmmarcacionOriginal1'] = $idmmarcacion;
                                $datosActulizar['idmmarcacionOriginal2'] = $idmmarcacion;
                                $datosActulizar['idmmarcacionOriginal3'] = $idmmarcacion;
                                $datosActulizar['idmmarcacionOriginal4'] = $idmmarcacion;

                                $datosActulizar['ngps_latitud1'] = $latitud;
                                $datosActulizar['ngps_longitud1'] = $longitud;
                                $datosActulizar['ngps_latitud2'] = $latitud;
                                $datosActulizar['ngps_longitud2'] = $longitud;
                                $datosActulizar['ngps_latitud3'] = $latitud;
                                $datosActulizar['ngps_longitud3'] = $longitud;
                                $datosActulizar['ngps_latitud4'] = $latitud;
                                $datosActulizar['ngps_longitud4'] = $longitud;
                                $datosActulizar['ngps_latitud5'] = $latitud;
                                $datosActulizar['ngps_longitud5'] = $longitud;

                                //$arrayDistancias = $arrayRecorrido['arrayDistancias'];
                                $datosActulizar['ndistancia1'] = $arrayRecorrido['distancia'];
                                $datosActulizar['ndistancia2'] = $arrayRecorrido['distancia'];
                                $datosActulizar['ndistancia3'] = $arrayRecorrido['distancia'];
                                $datosActulizar['ndistancia4'] = $arrayRecorrido['distancia'];
                                $datosActulizar['ndistancia5'] = $arrayRecorrido['distancia'];

                                $datosActulizar['iestadoDiferencia1'] = 0;
                                $datosActulizar['iestadoDiferencia2'] = 0;
                                $datosActulizar['iestadoDiferencia3'] = 0;
                                $datosActulizar['iestadoDiferencia4'] = 0;
                                $datosActulizar['iestadoDiferencia5'] = 0;

                                $datosActulizar['ngps_latitudPromedio'] = 0;
                                $datosActulizar['ngps_longitudPromedio'] = 0;
                                $datosActulizar['iTipoMarcacion'] = 1; //no proyectado
                                $datosActulizar['ndistanciaUltimoParadero'] = $distanciaToParadero + $arrayRecorrido['distanciaP1'];


                                $this->mcontroles->actualizaControlNuevo($datosActulizar);
                                $casoCorrida = 11;
                            } else {

                                //////hallando ta, da,tb,db
                                if ($arrayControl[0]['iestadoDiferencia1'] <= 0) {
                                    $ta = $arrayControl[0]['dHoraControl1'] + $arrayControl[0]['dHoraControl2'];
                                    $ta = $ta + $arrayControl[0]['dHoraControl3'] + $arrayControl[0]['dHoraControl4'];
                                    $ta = $ta + $arrayControl[0]['dHoraControl5'];
                                    $ta = $ta / 5;
                                    $da = $arrayControl[0]['ndistancia1'] + $arrayControl[0]['ndistancia2'];
                                    $da = $da + $arrayControl[0]['ndistancia3'] + $arrayControl[0]['ndistancia4'];
                                    $da = $da + $arrayControl[0]['ndistancia5'];
                                    $da = $da / 5;
                                } elseif ($arrayControl[0]['iestadoDiferencia2'] <= 0) {
                                    $ta = $arrayControl[0]['dHoraControl2'];
                                    $ta = $ta + $arrayControl[0]['dHoraControl3'] + $arrayControl[0]['dHoraControl4'];
                                    $ta = $ta + $arrayControl[0]['dHoraControl5'];
                                    $ta = $ta / 4;
                                    $da = $arrayControl[0]['ndistancia2'];
                                    $da = $da + $arrayControl[0]['ndistancia3'] + $arrayControl[0]['ndistancia4'];
                                    $da = $da + $arrayControl[0]['ndistancia5'];
                                    $da = $da / 4;
                                } elseif ($arrayControl[0]['iestadoDiferencia3'] <= 0) {
                                    $ta = $arrayControl[0]['dHoraControl3'] + $arrayControl[0]['dHoraControl4'];
                                    $ta = $ta + $arrayControl[0]['dHoraControl5'];
                                    $ta = $ta / 3;
                                    $da = $arrayControl[0]['ndistancia3'] + $arrayControl[0]['ndistancia4'];
                                    $da = $da + $arrayControl[0]['ndistancia5'];
                                    $da = $da / 3;
                                } elseif ($arrayControl[0]['iestadoDiferencia4'] <= 0) {
                                    $ta = $arrayControl[0]['dHoraControl4'];
                                    $ta = $ta + $arrayControl[0]['dHoraControl5'];
                                    $ta = $ta / 2;
                                    $da = $arrayControl[0]['ndistancia4'] + $arrayControl[0]['ndistancia5'];
                                    $da = $da / 2;
                                } elseif ($arrayControl[0]['iestadoDiferencia5'] <= 0) {
                                    $ta = $arrayControl[0]['dHoraControl5'];
                                    $da = $arrayControl[0]['ndistancia5'];
                                }
//                                $tb = $arrayRecorrido['tpromedio'];
//                                $db = $arrayRecorrido['dpromedio'];
                                $tb = $horaActual;

                                $db = $arrayRecorrido['distancia'];
                                // echo "ta: $ta  <br/>";
                                // echo "da: $da <br/>";
                                // echo "tb: $tb  <br/>";
                                // echo "db: $db <br/>";
                                $dt = $da + $db;

                                $vt = $dt / ($tb - $ta);
                                /////////////
                                $numeroParaderosPasados;
                                foreach ($paraderosPasados as $key => $value) {
                                    if ($key != $numeroParaderosPasados - 1 && $key != $numeroParaderosPasados - 2) {
                                        $dt = $dt + $value['ndistanciaParadero'];
                                    }
                                }
                                $vt = $dt / ($tb - $ta);
                                // echo "dt: $dt <br/>";
                                foreach ($paraderosPasados as $key => $value) {
                                    if (isset($paraderosPasados[$key + 1]['iddparaderos'])) {
                                        if ($paraderosPasados[$key + 1]['iddparaderos'] != $idParadero) {
                                            $datosInsertar['iddparaderos'] = $paraderosPasados[$key + 1]['iddparaderos'];

                                            $datosInsertar['iddparaderos1'] = $value['iddparaderos'];
                                            $datosInsertar['idmProgramacionSalidas'] = $idProgramacionSalida;
                                            $datosInsertar['iestado'] = 2;  //cerrado
                                            //////hallando los tiempos////
                                            $dhoraCalulada = $tb - $db / $vt;
                                            $datosInsertar['dHoraControl'] = $dhoraCalulada;
                                            // echo "ora calculada: $dhoraCalulada <br/>";
                                            $db = $db + $value['ndistanciaParadero'];
                                            $datosInsertar['dHoraControl1'] = $datosInsertar['dHoraControl'];
                                            $datosInsertar['dHoraControl2'] = $datosInsertar['dHoraControl'];
                                            $datosInsertar['dHoraControl3'] = $datosInsertar['dHoraControl'];
                                            $datosInsertar['dHoraControl4'] = $datosInsertar['dHoraControl'];
                                            $datosInsertar['dHoraControl5'] = $datosInsertar['dHoraControl'];
                                            $datosInsertar['ngps_latitud1'] = $value['ngps_latitud1'];
                                            $datosInsertar['ngps_longitud1'] = $value['ngps_longitud1'];
                                            $datosInsertar['ngps_latitudPromedio'] = $value['ngps_latitud1'];
                                            $datosInsertar['ngps_longitudPromedio'] = $value['ngps_longitud1'];
                                            $datosInsertar['ndistanciaUltimoParadero'] = $distanciaToParadero - $sumaDistancia;
                                            $sumaDistancia = $sumaDistancia + $value['ndistanciaParadero'];
                                            $datosInsertar['ndistanciaParaderoInicial'] = $distanciaToParadero - $sumaDistancia;
                                            $datosInsertar['dhoracontrolanterior'] = 0; // reemplazar por la hora fecha de salida
                                            $datosInsertar['iTipoMarcacion'] = 2; ///proyectado
                                            $idMarcacionControl = $this->mcontroles->insertaContrlInicial($datosInsertar);
                                        } else {
                                            ////// actualiza control en curso
                                            $datosActulizar['idmmarcacion_control'] = $arrayControl[0]['idmmarcacion_control'];
                                            $datosActulizar['iestado'] = 2;  //cerrado
                                            $dhoraCalulada = $tb - $db / $vt;
                                            $datosActulizar['dHoraControl'] = $dhoraCalulada;
                                            //echo "ora calculada: $dhoraCalulada <br/>";
                                            $datosActulizar['iTipoMarcacion'] = 2; //no proyectado
                                            $datosActulizar['ndistanciaUltimoParadero'] = $distanciaToParadero - $sumaDistancia;

                                            $this->mcontroles->actualizaControlPorCruce($datosActulizar);
                                            /////////////////////
                                        }
                                    }
                                }

                                if ($arrayRecorrido['paradero2'] == 0) {
                                    $respuesta = $this->msalidas->cancelarSalida($idProgramacionSalida);
                                    $estadoSalida = 0;
                                    //$data['dHoraControl'] = $dHoraControl;
                                    $casoCorrida = 16;
                                } else {
                                    $datosInsertar['iddparaderos'] = $arrayRecorrido['paradero1'];
                                    $datosInsertar['iddparaderos1'] = $arrayRecorrido['paradero2'];
                                    $datosInsertar['idmProgramacionSalidas'] = $idProgramacionSalida;
                                    $datosInsertar['iestado'] = 1;  //cerrado
                                    //////hallando los tiempos////
                                    $datosInsertar['dHoraControl'] = 0;


                                    $datosInsertar['dHoraControl1'] = $horaActual;
                                    $datosInsertar['dHoraControl2'] = $horaActual;
                                    $datosInsertar['dHoraControl3'] = $horaActual;
                                    $datosInsertar['dHoraControl4'] = $horaActual;
                                    $datosInsertar['dHoraControl5'] = $horaActual;



                                    $datosInsertar['idmmarcacionOriginal'] = $idmmarcacion;
                                    $datosInsertar['idmmarcacionOriginal1'] = $idmmarcacion;
                                    $datosInsertar['idmmarcacionOriginal2'] = $idmmarcacion;
                                    $datosInsertar['idmmarcacionOriginal3'] = $idmmarcacion;
                                    $datosInsertar['idmmarcacionOriginal4'] = $idmmarcacion;


                                    $datosInsertar['ngps_latitud1'] = $latitud;
                                    $datosInsertar['ngps_longitud1'] = $longitud;
                                    $datosInsertar['ngps_latitud2'] = $latitud;
                                    $datosInsertar['ngps_longitud2'] = $longitud;
                                    $datosInsertar['ngps_latitud3'] = $latitud;
                                    $datosInsertar['ngps_longitud3'] = $longitud;
                                    $datosInsertar['ngps_latitud4'] = $latitud;
                                    $datosInsertar['ngps_longitud4'] = $longitud;
                                    $datosInsertar['ngps_latitud5'] = $latitud;
                                    $datosInsertar['ngps_longitud5'] = $longitud;

                                    //$arrayDistancias = $arrayRecorrido['arrayDistancias'];
                                    $datosInsertar['ndistancia1'] = $arrayRecorrido['distancia'];
                                    $datosInsertar['ndistancia2'] = $arrayRecorrido['distancia'];
                                    ;
                                    $datosInsertar['ndistancia3'] = $arrayRecorrido['distancia'];
                                    ;
                                    $datosInsertar['ndistancia4'] = $arrayRecorrido['distancia'];
                                    ;
                                    $datosInsertar['ndistancia5'] = $arrayRecorrido['distancia'];
                                    ;


                                    $datosInsertar['iestadoDiferencia1'] = 0;
                                    $datosInsertar['iestadoDiferencia2'] = 0;
                                    $datosInsertar['iestadoDiferencia3'] = 0;
                                    $datosInsertar['iestadoDiferencia4'] = 0;
                                    $datosInsertar['iestadoDiferencia5'] = 0;

                                    $datosInsertar['ngps_latitudPromedio'] = 0;
                                    $datosInsertar['ngps_longitudPromedio'] = 0;
                                    $datosInsertar['ndistanciaUltimoParadero'] = $distanciaToParadero + $arrayRecorrido['distanciaP1'];

                                    $datosInsertar['ndistanciaParaderoInicial'] = $distanciaToParadero;
                                    $datosInsertar['dhoracontrolanterior'] = $horaActual; // reemplazar por la hora fecha de salida
                                    $datosInsertar['iTipoMarcacion'] = 1; //no proyectado
                                    $idMarcacionControl = $this->mcontroles->insertaContrlInicial($datosInsertar);
                                    $casoCorrida = 10;
                                }
                            }

                            //////////////fin de gravando control en curso/////////
                            ////////////////////////////////////


                            $paradero1 = $arrayRecorrido['paradero1'];
                            $paradero2 = $arrayRecorrido['paradero2'];
                        } else {
                            //// la ruta no fue localizada.
                            $tipoPantalla = 3;
                            $casoCorrida = 12;
                            $paradero1 = $arrayControl[0]['iddparaderos'];
                            $paradero2 = $arrayControl[0]['iddparaderos1'];
                        }
                    }
                }
            }

            $data["id"] = $idmmarcacion;
        } else {
            /// lo que no es valido
            /////////////////////
            $arrayProgramacionSalida = $this->msalidas->salidasxcelular($celular);
            if (count($arrayProgramacionSalida) == 0) {
                ////sin salidas

                $casoCorrida = 13;
            } else {
                ///con salidas 
                $idProgramacionSalida = $arrayProgramacionSalida[0]['idmProgramacionSalidas'];
                $arrayHoraSalida = $arrayProgramacionSalida[0]['horaSalida'];
                $arrayHoraSalida = explode("/", $arrayHoraSalida);
                $horaSalida = mktime($arrayHoraSalida[3], $arrayHoraSalida[4], $arrayHoraSalida[5], $arrayHoraSalida[1], $arrayHoraSalida[0], $arrayHoraSalida[2]);
                $arrayControl = $this->mcontroles->controlxsalida($idProgramacionSalida);
                if (count($arrayControl) == 0) {
                    //sin control por salida
                    $paradero1 = $arrayProgramacionSalida[0]['iddparaderos'];
                    $casoCorrida = 15;
                } else {
                    $idMarcacionControl = $arrayControl[0]['idmmarcacion_control'];
                    $iTipoMarcacion = 0;
                    $this->mcontroles->cambioEstadoControl($idMarcacionControl, $iTipoMarcacion);
                    $paradero1 = $arrayControl[0]['iddparaderos'];
                    $casoCorrida = 14;
                }
            }
        }



        //////////////
        $arrayDatosCelular = $this->mcelulares->getDatosCelularesxNumero($celular);
        if (count($arrayDatosCelular) == 0) {
            $data['nbusquedaGPS'] = '40';
            $data['ndistanciaGPS'] = '500';
        } else {
            $data['nbusquedaGPS'] = $arrayDatosCelular[0]['nbusquedaGPS'];
            $data['ndistanciaGPS'] = $arrayDatosCelular[0]['ndistanciaGPS'];
        }
        $data["latitud1"] = 0;
        $data["longitud1"] = 0;
        $data["latitud2"] = 0;
        $data["longitud2"] = 0;
        $data["latitud"] = $latitud;
        $data["longitud"] = $longitud;
        $data['valido'] = $iValido;
        $data['celular'] = $celular;
//        if ($estadoSalida == 1) {
//            $data['estado'] = $estadoSonido;
//            $respuestaServidor = $this->load->view('respuestas/control', $data, true);
//        } else {
//            $data['estado'] = 0;
//
//            $respuestaServidor = $this->load->view('respuestas/controlSinSalida', $data, true);
//        }
        $data['caso'] = $casoCorrida;
//        echo "caso: $casoCorrida <br/>";

        if ($casoCorrida == 1 || $casoCorrida == 3 || $casoCorrida == 7 || $casoCorrida == 8 || $casoCorrida == 10 || $casoCorrida == 11) {
            ///////////////registrando coordenada aproximada//////////////////////
            $datosmarcacion['idmProgramacionSalidas'] = $idProgramacionSalida;
            $datosmarcacion['iddparaderos'] = $paradero1;
            $datosmarcacion['iddparaderos1'] = $paradero2;
            $datosmarcacion['idmmarcacionOriginal'] = $idmmarcacion;
            $coordenadasAjustadas = $this->coordendasAjustadas($paradero1, $paradero2, $latitud, $longitud);
            $datosmarcacion['ngps_latitud'] = $coordenadasAjustadas['latitud'];
            $datosmarcacion['ngps_longitud'] = $coordenadasAjustadas['longitud'];

            $datosmarcacion['host'] = $_SERVER['REMOTE_ADDR'];
            $idmaracacioncorregida = $this->mcontroles->insertaMarcacionCorregida($datosmarcacion);
            ///////////////////////
            ///////////////////////
            //echo "idmaracioncorregida: $idmaracacioncorregida <br/>";
            ////////////////fin de registrando coordenada aproximada//////////////////////
            $data['estado'] = 2;
            /// lo que mostrara
            //datos
            ////
            $arrayDiferenciaDistancias;
            $arrayDiferenciaTiempos;
            $idProgramacionSalida;
            $paradero1;
            ///////obeniendo la ruta
            $arraySalida = $this->msalidas->getSalidaId($idProgramacionSalida);
            $idmruta = $arraySalida[0]['idmruta'];
            //$punto1 = $this->mparaderos->getDatosParadero($paradero1);
            $arrayparaderoControl = $this->mparaderos->getParaderoControl($paradero1);


            $data['ultimoParadero'] = $arrayparaderoControl[0]['vnombre_paradero'];
            $dHoraControlParadero1 = 0;
            $idparaderoControl = $arrayparaderoControl[0]['iddparaderos'];
            $arrayControlPuntoControl = $this->mcontroles->controlParadero1Salida($idparaderoControl, $idProgramacionSalida);
            $tiempoControl = $arrayControlPuntoControl[0]['dHoraControl'];
            $dHoraControlParadero1 = $tiempoControl;
            $idMarcacionPuntoControl = $arrayControlPuntoControl[0]['idmmarcacion_control'];
            $arryAnteriores = $this->mcontroles->obtenerSiguientes($tiempoControl, $idMarcacionPuntoControl);
            $numero = count($arryAnteriores);
            if ($numero == 0) {
                $tiempo1 = '';
                $tiempo2 = '';
                $tiempo3 = '';
                $distancia1 = '';
                $distancia2 = '';
                $distancia3 = '';
            } else if ($numero == 1) {
                $arrayControlActual = $this->mcontroles->ultimoControl($idProgramacionSalida);
                $arrayContro1 = $this->mcontroles->ultimoControl($arryAnteriores[0]['idmProgramacionSalidas']);
                $distancia1 = round($arrayContro1[0]['ndistanciaUltimoParadero'] - $arrayControlActual[0]['ndistanciaUltimoParadero'], 2);
                $tiempo1 = $this->funciones->formatoHoraPantalla($arryAnteriores[0]['diferencia']);
                $tiempo2 = "";
                $tiempo3 = "";
                $distancia2 = '';
                $distancia3 = '';
            } else if ($numero == 2) {
                $arrayControlActual = $this->mcontroles->ultimoControl($idProgramacionSalida);
                $arrayContro1 = $this->mcontroles->ultimoControl($arryAnteriores[0]['idmProgramacionSalidas']);
                $distancia1 = round($arrayContro1[0]['ndistanciaUltimoParadero'] - $arrayControlActual[0]['ndistanciaUltimoParadero'], 2);
                $arrayContro2 = $this->mcontroles->ultimoControl($arryAnteriores[1]['idmProgramacionSalidas']);
                $distancia2 = round($arrayContro2[0]['ndistanciaUltimoParadero'] - $arrayControlActual[0]['ndistanciaUltimoParadero'], 2);
                $distancia3 = '';
                $tiempo1 = $this->funciones->formatoHoraPantalla($arryAnteriores[0]['diferencia']);
                $tiempo2 = $this->funciones->formatoHoraPantalla($arryAnteriores[1]['diferencia']);
                $tiempo3 = "";
            } else if ($numero == 3) {
                $arrayControlActual = $this->mcontroles->ultimoControl($idProgramacionSalida);
                $arrayContro1 = $this->mcontroles->ultimoControl($arryAnteriores[0]['idmProgramacionSalidas']);
                $distancia1 = round($arrayContro1[0]['ndistanciaUltimoParadero'] - $arrayControlActual[0]['ndistanciaUltimoParadero'], 2);
                $arrayContro2 = $this->mcontroles->ultimoControl($arryAnteriores[1]['idmProgramacionSalidas']);
                $distancia2 = round($arrayContro2[0]['ndistanciaUltimoParadero'] - $arrayControlActual[0]['ndistanciaUltimoParadero'], 2);
                $arrayContro3 = $this->mcontroles->ultimoControl($arryAnteriores[2]['idmProgramacionSalidas']);
                $distancia3 = round($arrayContro3[0]['ndistanciaUltimoParadero'] - $arrayControlActual[0]['ndistanciaUltimoParadero'], 2);
                $tiempo1 = $this->funciones->formatoHoraPantalla($arryAnteriores[0]['diferencia']);
                $tiempo2 = $this->funciones->formatoHoraPantalla($arryAnteriores[1]['diferencia']);
                $tiempo3 = $this->funciones->formatoHoraPantalla($arryAnteriores[2]['diferencia']);
            }
//echo "paradero1: $paradero1 <br/>";

            $data['horaControl'] = $dHoraControlParadero1;
            $data['distancia1'] = $distancia1;
            $data['distancia2'] = $distancia2;
            $data['distancia3'] = $distancia3;
            $data['tiempo1'] = $tiempo1;
            $data['tiempo2'] = $tiempo2;
            $data['tiempo3'] = $tiempo3;
            $respuestaServidor = $this->load->view('respuestas/pantalla3', $data, true);
        }
        if ($casoCorrida == 2 || $casoCorrida == 13) { //sin hora de programacion de salida
            $data['estado'] = $iValido;

            $respuestaServidor = $this->load->view('respuestas/pantalla1', $data, true);
        }
        if ($casoCorrida == 4 || $casoCorrida == 15) { // con programacion de salida sin control inicial.
            $idProgramacionSalida;
            $arraySalida = $this->msalidas->getSalidaId($idProgramacionSalida);
            $iddmruta=$arraySalida[0]['idmruta'];
            $arrayTiempoParaderos=$this->mparaderos->gettiempoParaderos($idmruta);
            $data['estado'] = $iValido;
            $data['horaSalida'] = $horaSalida;
            $horaActual;
            $diferenciaTiempo=$horaSalida-$horaActual;
            $tiempoinicial=0;
            if($diferenciaTiempo>0){
                foreach ($arrayTiempoParaderos as $key => $value) {
                    
                }
            }
            


            $respuestaServidor = $this->load->view('respuestas/pantalla4', $data, true);
        }
        if ($casoCorrida == 5) { // no en hora de salida
            $data['estado'] = $iValido;
            $data['horaSalida'] = $horaSalida;
            $respuestaServidor = $this->load->view('respuestas/pantalla2', $data, true);
        }
        if ($casoCorrida == 6 || $casoCorrida == 16) { // recorrido finalizado
            $data['estado'] = $iValido;
            $data['horaSalida'] = $data['dHoraControl'];
            $respuestaServidor = $this->load->view('respuestas/pantalla2', $data, true);
        }
        if ($casoCorrida == 9 || $casoCorrida == 12 || $casoCorrida == 14) { // no en hora de salida
            ///////////////registrando coordenada aproximada//////////////////////
            ///////////////////////
            ///////////////////////
            //echo "idmaracioncorregida: $idmaracacioncorregida <br/>";
            ////////////////fin de registrando coordenada aproximada//////////////////////
            $data['estado'] = 2;
            /// lo que mostrara
            //datos
            ////
            $arrayDiferenciaDistancias;
            $arrayDiferenciaTiempos;
            $idProgramacionSalida;
            $paradero1;
            ///////obeniendo la ruta
            $arraySalida = $this->msalidas->getSalidaId($idProgramacionSalida);
            $idmruta = $arraySalida[0]['idmruta'];
            //$punto1 = $this->mparaderos->getDatosParadero($paradero1);
            $arrayparaderoControl = $this->mparaderos->getParaderoControl($paradero1);


            $data['ultimoParadero'] = $arrayparaderoControl[0]['vnombre_paradero'];
            $dHoraControlParadero1 = 0;
            $idparaderoControl = $arrayparaderoControl[0]['iddparaderos'];
            $arrayControlPuntoControl = $this->mcontroles->controlParadero1Salida($idparaderoControl, $idProgramacionSalida);
            $tiempoControl = $arrayControlPuntoControl[0]['dHoraControl'];
            $dHoraControlParadero1 = $tiempoControl;
            $idMarcacionPuntoControl = $arrayControlPuntoControl[0]['idmmarcacion_control'];
            $arryAnteriores = $this->mcontroles->obtenerSiguientes($tiempoControl, $idMarcacionPuntoControl);
            $numero = count($arryAnteriores);
            if ($numero == 0) {
                $tiempo1 = '';
                $tiempo2 = '';
                $tiempo3 = '';
                $distancia1 = '';
                $distancia2 = '';
                $distancia3 = '';
            } else if ($numero == 1) {
                $arrayControlActual = $this->mcontroles->ultimoControl($idProgramacionSalida);
                $arrayContro1 = $this->mcontroles->ultimoControl($arryAnteriores[0]['idmProgramacionSalidas']);
                $distancia1 = round($arrayContro1[0]['ndistanciaUltimoParadero'] - $arrayControlActual[0]['ndistanciaUltimoParadero'], 2);
                $tiempo1 = $this->funciones->formatoHoraPantalla($arryAnteriores[0]['diferencia']);
                $tiempo2 = "";
                $tiempo3 = "";
                $distancia2 = '';
                $distancia3 = '';
            } else if ($numero == 2) {
                $arrayControlActual = $this->mcontroles->ultimoControl($idProgramacionSalida);
                $arrayContro1 = $this->mcontroles->ultimoControl($arryAnteriores[0]['idmProgramacionSalidas']);
                $distancia1 = round($arrayContro1[0]['ndistanciaUltimoParadero'] - $arrayControlActual[0]['ndistanciaUltimoParadero'], 2);
                $arrayContro2 = $this->mcontroles->ultimoControl($arryAnteriores[1]['idmProgramacionSalidas']);
                $distancia2 = round($arrayContro2[0]['ndistanciaUltimoParadero'] - $arrayControlActual[0]['ndistanciaUltimoParadero'], 2);
                $distancia3 = '';
                $tiempo1 = $this->funciones->formatoHoraPantalla($arryAnteriores[0]['diferencia']);
                $tiempo2 = $this->funciones->formatoHoraPantalla($arryAnteriores[1]['diferencia']);
                $tiempo3 = "";
            } else if ($numero == 3) {
                $arrayControlActual = $this->mcontroles->ultimoControl($idProgramacionSalida);
                $arrayContro1 = $this->mcontroles->ultimoControl($arryAnteriores[0]['idmProgramacionSalidas']);
                $distancia1 = round($arrayContro1[0]['ndistanciaUltimoParadero'] - $arrayControlActual[0]['ndistanciaUltimoParadero'], 2);
                $arrayContro2 = $this->mcontroles->ultimoControl($arryAnteriores[1]['idmProgramacionSalidas']);
                $distancia2 = round($arrayContro2[0]['ndistanciaUltimoParadero'] - $arrayControlActual[0]['ndistanciaUltimoParadero'], 2);
                $arrayContro3 = $this->mcontroles->ultimoControl($arryAnteriores[2]['idmProgramacionSalidas']);
                $distancia3 = round($arrayContro3[0]['ndistanciaUltimoParadero'] - $arrayControlActual[0]['ndistanciaUltimoParadero'], 2);
                $tiempo1 = $this->funciones->formatoHoraPantalla($arryAnteriores[0]['diferencia']);
                $tiempo2 = $this->funciones->formatoHoraPantalla($arryAnteriores[1]['diferencia']);
                $tiempo3 = $this->funciones->formatoHoraPantalla($arryAnteriores[2]['diferencia']);
            }
//echo "paradero1: $paradero1 <br/>";

            $data['horaControl'] = $dHoraControlParadero1;
            $data['distancia1'] = $distancia1;
            $data['distancia2'] = $distancia2;
            $data['distancia3'] = $distancia3;
            $data['tiempo1'] = $tiempo1;
            $data['tiempo2'] = $tiempo2;
            $data['tiempo3'] = $tiempo3;
            $respuestaServidor = $this->load->view('respuestas/pantalla3', $data, true);
            //$respuestaServidor = $this->load->view('respuestas/pantalla6', $data, true);
        }


        $datosRespuestaServidor['idmmarcacionOriginal'] = $idmmarcacion;
        $datosRespuestaServidor['vrespuesta'] = $respuestaServidor;
        $datosRespuestaServidor['vurl'] = $url;
        $nfin = microtime(true);
        $ndiferencia = $nfin - $ninicio;
        $datosRespuestaServidor['ninicio'] = $ninicio;
        $datosRespuestaServidor['nfin'] = $ninicio;
        $datosRespuestaServidor['ndiferencia'] = $ndiferencia;
        $datosRespuestaServidor['iTipoCaso'] = $casoCorrida;
        $idRespuesta = $this->mcontroles->insertaRespuestaServidor($datosRespuestaServidor);
       // echo "caso: $casoCorrida <br/>";
        //echo "celular: $celular <br/>";
        echo $respuestaServidor;
    }

    function distanciaCoordenadaParadero($latitud, $longitud, $paradero) {


        $punto = $this->mparaderos->getDatosParadero($paradero);

        $distancia = $this->distanciaAproximadaParaderoPunto($punto, $latitud, $longitud);
        return $distancia;
    }

    function distanciaParaderos($paradero1, $paradero2) {

        $punto1 = $this->mparaderos->getDatosParadero($paradero1);
        $latitud1 = $punto1[0]['ngps_latitud1'];
        $longitud1 = $punto1[0]['ngps_longitud1'];
        $punto2 = $this->mparaderos->getDatosParadero($paradero2);
        $latitud2 = $punto2[0]['ngps_latitud1'];
        $longitud2 = $punto2[0]['ngps_longitud1'];

        //echo "(" . $diferenciaLatitud . "xxxxxxxxx" . $diferenciaLongitud . ")";
        $radio = 6373;
        $x1 = deg2rad($latitud1) * $radio;
        $y1 = deg2rad($longitud1) * $radio;
        $x2 = deg2rad($latitud2) * $radio;
        $y2 = deg2rad($longitud2) * $radio;
        $d2 = ($x2 - $x1) * ($x2 - $x1) + ($y2 - $y1) * ($y2 - $y1);
        $d2 = sqrt($d2);
        //$distancia = sqrt($diferenciaLatitud * $diferenciaLatitud + $diferenciaLongitud * $diferenciaLongitud);
        //echo "($distancia)";
        return $d2;
    }

    function cruzaParaderoEstados($datosCruce) {
        $e1 = $datosCruce['e1'];
        $e2 = $datosCruce['e2'];
        $e3 = $datosCruce['e3'];
        $e4 = $datosCruce['e4'];
        $e5 = $datosCruce['e5'];
        $e6 = $datosCruce['e6'];
        $paradero2 = $datosCruce['paradero2'];
        $longitud = $datosCruce['longitud'];
        $latitud = $datosCruce['latitud'];
        $longitudPromedio = $datosCruce['longitudPromedio'];
        $latitudPromedio = $datosCruce['latitudPromedio'];
        $estado = 1;
        $distancia1 = 0;
        $distancia2 = 0;
        $distancia3 = 0;
        $valido = 1;
        if (($e1 > 0) && ($e2 > 0)) {
            $paradero3 = $this->mparaderos->siguienteParadero($paradero2);
            if ($paradero3 == 0) {
                $estado = 2;
            } else {
                $punto2 = $this->mparaderos->getDatosParadero($paradero2);
                $punto3 = $this->mparaderos->getDatosParadero($paradero3);
                $distancia1 = $this->distanciaCoordenadaParadero($latitud, $longitud, $paradero3);
                $distancia2 = $this->distanciaAproximadaParaderos($punto2, $punto3);
                //echo "e1 and e2 mayor que cero <br/>";
                if ($distancia1 < $distancia2) {
                    $distancia3 = $this->distanciaCoordenadaParadero($latitudPromedio, $longitudPromedio, $paradero2);
                    //echo "distancia1 menor distancia2 <br/>";
                    //echo "latitudPromedio:$latitudPromedio<br/>";
                    //echo "longitudPromedio:$longitudPromedio<br/>";
                    if ($distancia3 < 0.1) {
                        $estado = 2;
                        //echo "distancia3 < minimo <br/>";
                    }
                }
            }
            $valido = 2;
        }
        //echo "distancia1:$distancia1 <br/>";
        // echo "distancia2:$distancia2 <br/>";
        //echo "distancia3:$distancia3 <br/>";
        $estadoCruce['cruce'] = $estado;
        $estadoCruce['valido'] = $valido;
        return $estadoCruce;
    }

    function coordendasAjustadas($paradero1, $paradero2, $lat, $lon) {



        $punto1 = $this->mparaderos->getDatosParadero($paradero1);
        $punto2 = $this->mparaderos->getDatosParadero($paradero2);
        $latitud1 = $punto1[0]['ngps_latitud1'];
        $longitud1 = $punto1[0]['ngps_longitud1'];
        $latitud2 = $punto2[0]['ngps_latitud1'];
        $longitud2 = $punto2[0]['ngps_longitud1'];
        //hallando la pendiente
        //x =lon
        //y =lat
        $m = ($latitud2 - $latitud1) / ($longitud2 - $longitud1);
        $latitudCorregida = ($lat * $m * $m + $lon * $m - $longitud1 * $m + $latitud1) / ($m * $m + 1);
        $longitudCorregida = ($longitud1 * $m * $m + $lon + $lat * $m - $latitud1 * $m) / ($m * $m + 1);
        $arrayCordenada['latitud'] = $latitudCorregida;

        $arrayCordenada['longitud'] = $longitudCorregida;
////        
//        
        //  $arrayCordenada['latitud'] = $lat;
//        
        //    $arrayCordenada['longitud'] = $lon;

        return $arrayCordenada;
    }

    function distanciaReal($lat1, $lon1, $lat2, $lon2) {
        $r = 6373;
        $lat1 = deg2rad($lat1);
        $lon1 = deg2rad($lon1);
        $lat2 = deg2rad($lat2);
        $lon2 = deg2rad($lon2);



        $dlat = $lat2 - $lat1;
        $dlon = $lon2 - $lon1;
        $a = sin($dlat / 2);
        $a = $a * $a;
        $b = sin($dlon / 2);
        $b = $b * $b;
        $b = $b * cos($lat2);
        $b = $b * cos($lat1);
        $c = $a + $b;

        $y = sqrt($c);
        $x = sqrt(1 - $c);
        $d = 2 * atan2($y, $x);
        $d = $r * $d;
        return $d;
    }

    function distanciaRealParaderoCoordenadas($idParadero, $lat, $lon) {
        $punto = $this->mparaderos->getDatosParadero($idParadero);
        $latitud1 = $punto[0]['ngps_latitud1'];
        $longitud1 = $punto[0]['ngps_longitud1'];
        $distancia = $this->distanciaReal($latitud1, $longitud1, $lat, $lon);
        return $distancia;
    }

    function distanciaRealParaderos($idParadero1, $idParadero2) {
        $punto1 = $this->mparaderos->getDatosParadero($idParadero1);
        $latitud1 = $punto1[0]['ngps_latitud1'];
        $longitud1 = $punto1[0]['ngps_longitud1'];
        $punto2 = $this->mparaderos->getDatosParadero($idParadero2);
        $latitud2 = $punto2[0]['ngps_latitud1'];
        $longitud2 = $punto2[0]['ngps_longitud1'];
        $distancia = $this->distanciaReal($latitud1, $longitud1, $latitud2, $longitud2);
        return $distancia;
    }

    function haversine($l1, $o1, $l2, $o2) {
        $l1 = deg2rad($l1);
        $sinl1 = sin($l1);
        $l2 = deg2rad($l2);
        $o1 = deg2rad($o1);
        $o2 = deg2rad($o2);

        return (7926 - 26 * $sinl1) * asin(min(1, 0.707106781186548 * sqrt((1 - (sin($l2) * $sinl1) - cos($l1) * cos($l2) * cos($o2 - $o1)))));
    }

    function verificarRuta($celular) {
        //echo "celular: $celular <br>";
        $tolerancia = "00:10:00"; //equivalene a 20 min ,
        $numeroPuntos = 5;
        $minimoDistintos = 3;
        $minimoSuma = 0.5; //kilometros
        $minimoIndividual = 0.1; //en kilometros
        $estadoEnRuta = 0;
        $estadoMinimoDistintos = 1;
        $arrayPuntos = $this->mcontroles->getPuntosAnteriores($celular, $numeroPuntos, $tolerancia);
        //print_r($arrayPuntos);
        //echo "<br/>numero de puntos " . count($arrayPuntos) . "<br>";
        if (count($arrayPuntos) == $numeroPuntos) {
            // hallando las rutas
            //echo "entro por numero de puntos<br>";
            $arrayRuta = $this->mparaderos->getRutasCelular($celular);
            $nrutas = count($arrayRuta);
            //print_r($arrayRuta);
            //$estadoEnRuta = 0;
            $numeroDistintos = $numeroPuntos;
            if ($nrutas != 0) {  // si el celular tiene rutas
                for ($i = 0; $i < $nrutas; $i++) { //recorre rutas
                    //$estadoParaderos = 1;
                    $idmruta = $arrayRuta[$i]['idmruta'];
                    $arrayParaderos = $this->mparaderos->getParaderos($idmruta);
                    //echo "<br/> ArrayParaderos<br/>";
                    $arrayEnRuta = $this->hallarRuta($arrayPuntos, $celular, $idmruta, 0);
                    if ($arrayEnRuta['estadoEnRuta'] == 1) {
                        $arrayEnRuta['ruta'] = $idmruta;
                        $arrayEnRuta['iddtransporte_linea'] = $arrayRuta[$i]['iddtransporte_linea'];
                        $arrayEnRuta['idmcelulares'] = $arrayRuta[0]['idmcelulares'];
                        $arrayEnRuta['arrayPuntos'] = $arrayPuntos;
                        $estadoEnRuta = 1;
                        break;
                    }
                }
            }
        } else {
            $arrayEnRuta['estadoEnRuta'] = 0;
        }
//        if ($estadoEnRuta == 1) {
//
//        } else {
//            // echo "estado salida: 0 <br>";
//            $data['idmProgramacionSalidas'] = 0;
//        }
        //$data=array();
        return $arrayEnRuta;
    }

    function hallarRuta($arrayPuntos, $celular, $idmruta, $idParadero) {
        $tolerancia = "00:10:00"; //equivalene a 20 min ,
        $numeroPuntos = 5;
        $minimoDistintos = 3;
        $minimoSuma = 0.5; //kilometros
        $minimoIndividual = 0.1; //en kilometros
        $estadoEnRuta = 0;
        $estadoMinimoDistintos = 1;
        $indiceminimo = 1.5;
        $numeroDistintos = $numeroPuntos;

        //$arrayParaderos = $this->mparaderos->getParaderos($idmruta);
        if ($idParadero == 0) {
            $arrayParaderos = $this->mparaderos->getParaderos($idmruta);
        } else {
            $arrayParaderos = $this->mparaderos->getParaderosRestantes($idParadero);
        }

        //echo "<br/> ArrayParaderos<br/>";
        //print_r($arrayParaderos);
        // echo "<br/>";
        $nparaderos = count($arrayParaderos);
        //echo"numero paraderos=$nparaderos <br/>";
        if ($nparaderos == 0) {
            
        } else {
            $paradero1 = $arrayParaderos[0]['iddparaderos'];
            $paradero2 = $arrayParaderos[1]['iddparaderos'];
        }


        for ($j = 0; $j < $nparaderos; $j++) { //recorre paraderos
            $estadoPuntos = 1;
            $punto1 = $this->mparaderos->getDatosParadero($paradero1);
            $punto2 = $this->mparaderos->getDatosParadero($paradero2);
            //echo "paradero1:" . $punto1[0]['vnombre_paradero'] . "<br/>";
            //echo "paradero2:" . $punto2[0]['vnombre_paradero'] . "<br/>";
            $sumaDistancias = 0;
            $distanciaParaderos = $this->distanciaAproximadaParaderos($punto1, $punto2);
            //$distanciaAnterior = $distanciaParaderos;
            $distanciaAnterior = 0;
            $distanciaAnteriorAjustado = 0;
            ////
            //agregar angulos
            //////

            $recorrido = 0;
            $arrayTiempos = array();
            $arrayDistancias = array();
            for ($k = 0; $k < $numeroPuntos; $k++) { //recorre paraderos
                $latitudk = $arrayPuntos[$k]['ngps_latitud'];
                $longitudk = $arrayPuntos[$k]['ngps_longitud'];
                $distanciaParadero2 = $this->distanciaAproximadaParaderoPunto($punto2, $arrayPuntos[$k]['ngps_latitud'], $arrayPuntos[$k]['ngps_longitud']);
                $arrayDistancias[$k] = $distanciaParadero2;
                if ($distanciaParadero2 > $distanciaParaderos) {//si la distancia
                    $estadoPuntos = 0;  //es mayor a la distancia entre paraderos
                    //echo "distancia mayor a la de los paraderos <br/>";
                    //print_r($arrayDistancias);
                    break;
                }
                if ($distanciaParadero2 < $distanciaAnterior) { // si la distancia esta
                    $estadoPuntos = 0;  //aumentando
                    // echo "distancia en aumento<br/>";
                    //  print_r($arrayDistancias);
                    break;
                }

                $arrayCoordenadasAjustadas[$k] = $this->coordendasAjustadas($paradero1, $paradero2, $latitudk, $longitudk);
                //////////////
                ////////////////
                $distanciaParadero2Ajustado = $this->distanciaAproximadaParaderoPunto($punto2, $arrayCoordenadasAjustadas[$k]['latitud'], $arrayCoordenadasAjustadas[$k]['longitud']);
                $arrayDistanciasAjustado[$k] = $distanciaParadero2Ajustado;
                if ($k > 1) {
                    $recorrido = $recorrido + $distanciaParadero2Ajustado - $distanciaAnteriorAjustado;
                }


                if ($distanciaParadero2Ajustado > $distanciaParaderos) {//si la distancia
                    $estadoPuntos = 0;  //es mayor a la distancia entre paraderos
                    //echo "distancia ajustada mayor a la de los paraderos <br/>";
                    // print_r($arrayDistancias);
                    break;
                }
                if ($distanciaParadero2Ajustado < $distanciaAnteriorAjustado) { // si la distancia esta
                    $estadoPuntos = 0;  //aumentando
                    // echo "distancia ajustada en aumento<br/>";
                    // print_r($arrayDistancias);
                    break;
                }
                //////////////
                ///////////////
                if ($distanciaParadero2 == $distanciaAnterior) {
                    $numeroDistintos = $numeroDistintos - 1;
                    if ($numeroDistintos < $minimoDistintos) {
                        $estadoPuntos = 0;  //por minimo numero de puntos diferentes
                        $estadoMinimoDistintos = 0;
                        //echo "minimos permitidos<br/>";
                        // print_r($arrayDistancias);
                        break;
                    }
                }
                $distanciaAnterior = $distanciaParadero2;
                $distanciaAnteriorAjustado = $distanciaParadero2Ajustado;
                $distanciaLinea = $this->distanciaLineaParadero($punto1, $punto2, $arrayPuntos[$k]['ngps_latitud'], $arrayPuntos[$k]['ngps_longitud']);
                if ($distanciaLinea > $minimoIndividual) {
                    $estadoPuntos = 0;
                    //echo "distancia a la linea es mayor a la minima: $distanciaLinea<br/>";
                    //print_r($arrayDistancias);
                    break;
                }
                $sumaDistancias = $sumaDistancias + $distanciaLinea;
                if ($sumaDistancias > $minimoSuma) {
                    $estadoPuntos = 0;
                    // echo "suma de distancia a la linea es mayor a la minima:$sumaDistancias<br/>";
                    // print_r($arrayDistancias);
                    break;
                }


                //$arrayTiemposAux = explode("/", $arrayPuntos[0]['dFechaCreacion']);
                //$arrayTiempos[$k] = mktime($arrayTiemposAux[3], $arrayTiemposAux[4], $arrayTiemposAux[5], $arrayTiemposAux[1], $arrayTiemposAux[0], $arrayTiemposAux[2]);
                $arrayTiempos[$k] = $arrayPuntos[0]['ntiempo'];
            }//// fin for k
            if ($recorrido != 0) {
                $indice = $sumaDistancias / $recorrido;
                $estadoIndice = 1;
                //echo "indice:$indice<br/>";
                if ($indice > 1.5) {
                    $estadoIndice = 0;
                }
            } else {
                $estadoIndice = 0;
            }



            if ($estadoMinimoDistintos == 0) {
                //$i = $nrutas;
                break; //por minimo distintos
            }
            //echo "estadoPuntos: $estadoPuntos <br/>";
            if ($estadoPuntos == 1 && $estadoIndice == 1) {  //paso las pruebas osea en ruta
                // $i = $nrutas; //para que salga del bucle
                $estadoEnRuta = 1;
                break;
            }
            /////se calculan los nuevos paraderos
            if ($j < $nparaderos - 2) {
                $paradero1 = $arrayParaderos[$j + 1]['iddparaderos'];
                $paradero2 = $arrayParaderos[$j + 2]['iddparaderos'];
            }
        }

        $respuesta["paradero1"] = $paradero1;
        $respuesta["paradero2"] = $paradero2;
        $respuesta['estadoEnRuta'] = $estadoEnRuta;
//calculando la hora de salida
        if ($estadoEnRuta == 1) {

            $arrayParaderosAnteriores = $this->mparaderos->paraderosAnteriores($paradero1);
            $dist = 0;
            $sumaDist = 0;
            $paraderoInicial = 0;
            foreach ($arrayParaderosAnteriores as $fila) {
                if ($fila['idmtipoparadero'] == 2) {
                    $sumaDist = $sumaDist + $dist;
                    $paraderoInicial = $fila['iddparaderos'];
                    break;
                } else {
                    $sumaDist = $sumaDist + $dist;
                    $dist = $fila['ndistanciaParadero'];
                }
            }

//            $arrayTiempo1 = explode("/", $arrayPuntos[0]['dFechaCreacion']);
//            $arrayTiempo5 = explode("/", $arrayPuntos[$numeroPuntos - 1]['dFechaCreacion']);
            $arrayTiempo1 = $arrayPuntos[0]['ntiempo'];
            $arrayTiempo5 = $arrayPuntos[$numeroPuntos - 1]['ntiempo'];


            // print_r($arrayDistancias);
            //  echo "</br>";
            // print_r($arrayDistanciasAjustado);
            // echo "</br>";
            //echo $arrayPuntos[0]['dFechaCreacion'] . "</br>";
            $d5 = $arrayDistanciasAjustado[$numeroPuntos - 1];
            $d1 = $arrayDistanciasAjustado[0];
            $t1 = $arrayTiempo1;
            $t5 = $arrayTiempo5;
            $dt = $distanciaParaderos + $sumaDist;
            // echo "array distancia ajustada <br/>";
            //print_r($arrayDistanciasAjustado);
            // echo " <br/>";
            $dpromedio = $distanciaParaderos - array_sum($arrayDistanciasAjustado) / count($arrayDistanciasAjustado);
            $tpromedio = array_sum($arrayTiempos) / count($arrayTiempos);
            // echo "d1: $d1<br/>";
            // echo "d5: $d5<br/>";
            // echo "dt: $dt<br/>";
            // echo "distancia paraderos: $distanciaParaderos<br/>";
            // echo "t1: $t1<br/>";
            $fecha1 = date("d-m-Y H:i:s", $t1);
            //  echo "$fecha1 </br>";
            //  echo "t5: $t5<br/>";
            $fecha5 = date("d-m-Y H:i:s", $t5);
            //   echo "$fecha5 </br>";
            $velocidad = ($d1 - $d5) / ($t5 - $t1);
            $tparadero1 = $t1 - ($dt - $d1) / $velocidad;

            $dt = $dt + $sumaDist;
            $tparaderoInicial = $t1 - ($dt - $d1) / $velocidad;
            //echo "<br/>tx: $tx";
            ////////////////////////////////////

            $fechaParadero1 = date("Y-m-d H:i:s", $tparadero1);
            $respuesta['tiempoParadero1'] = $tparadero1;
            $respuesta['tiempoParaderoInicial'] = $tparaderoInicial;
            $respuesta["paraderoInicial"] = $paraderoInicial;
            $respuesta['velocidad'] = $velocidad;
            $respuesta['dpromedio'] = $dpromedio;
            $respuesta['tpromedio'] = $tpromedio;
            $respuesta['arrayDistancias'] = $arrayDistancias;
            $respuesta['arrayCoordenadasAjustadas'] = $arrayCoordenadasAjustadas;
            $respuesta['arrayTiempos'] = $arrayTiempos;
            $respuesta['distanciaP1Punto'] = $d5 - $d1;
        } else {
            $respuesta['tiempoParadero1'] = 0;
            $respuesta['tiempoParaderoInicial'] = 0;
        }

        return $respuesta;
    }

    function distanciaLineaParadero($punto1, $punto2, $latitud, $longitud) {
        $radio = 6373;
        $x1 = deg2rad($punto1[0]['ngps_latitud1']) * $radio;
        $x2 = deg2rad($punto2[0]['ngps_latitud1']) * $radio;
        $y1 = deg2rad($punto1[0]['ngps_longitud1']) * $radio;
        $y2 = deg2rad($punto2[0]['ngps_longitud1']) * $radio;
        $a = deg2rad($latitud) * $radio;
        $b = deg2rad($longitud) * $radio;
        $d1 = abs(($b - $y1) * ($x2 - $x1) + ($x1 - $a) * ($y2 - $y1));

        $d2 = ($x2 - $x1) * ($x2 - $x1) + ($y2 - $y1) * ($y2 - $y1);
        $d2 = sqrt($d2);

        $distancia = $d1 / $d2;
        return $distancia;
    }

    function distanciaAproximadaParaderoPunto($punto, $latitud, $longitud) {
        $radio = 6373;
        $x1 = deg2rad($punto[0]['ngps_latitud1']) * $radio;
        $y1 = deg2rad($punto[0]['ngps_longitud1']) * $radio;
        $x2 = deg2rad($latitud) * $radio;
        $y2 = deg2rad($longitud) * $radio;
        $d2 = ($x2 - $x1) * ($x2 - $x1) + ($y2 - $y1) * ($y2 - $y1);
        $d2 = sqrt($d2);
        return $d2;
    }

    function distanciaAproximadaPuntos($latitud, $longitud, $latitud1, $longitud1) {
        $radio = 6373;
        $x1 = deg2rad($latitud1) * $radio;
        $y1 = deg2rad($longitud1) * $radio;
        $x2 = deg2rad($latitud) * $radio;
        $y2 = deg2rad($longitud) * $radio;
        $d2 = ($x2 - $x1) * ($x2 - $x1) + ($y2 - $y1) * ($y2 - $y1);
        $d2 = sqrt($d2);
        return $d2;
    }

    function distanciaAproximadaParaderos($punto1, $punto2) {
        $radio = 6373;
        $x1 = deg2rad($punto1[0]['ngps_latitud1']) * $radio;
        $y1 = deg2rad($punto1[0]['ngps_longitud1']) * $radio;
        $x2 = deg2rad($punto2[0]['ngps_latitud1']) * $radio;
        $y2 = deg2rad($punto2[0]['ngps_longitud1']) * $radio;
        $d2 = ($x2 - $x1) * ($x2 - $x1) + ($y2 - $y1) * ($y2 - $y1);
        $d2 = sqrt($d2);
        return $d2;
    }

    function determinaRuta($idParadero, $celular, $latitud, $longitud) {
        $arrayRespuesta = array();
        $encontrado = false;
        $arrayPosibles = array();
        $paradero1 = $idParadero;
        $contadorPosibles = 0;
        $cerca = 0;
        while (!$encontrado) {

            $siguienteParadero = $this->mparaderos->siguienteParadero($paradero1);

            if ($siguienteParadero == 0) {
                $encontrado = true;
                $tolerancia = "00:10:00"; //equivalene a 20 min ,
                $numeroPuntos = 3;
                $arrayPuntos = $this->mcontroles->getPuntosAnteriores($celular, $numeroPuntos, $tolerancia);
                $n = 0;
                $cerca = 1;
                $distanciaMinima = 0.05;
                $distanciaPromedio = 0;
                foreach ($arrayPuntos as $key => $value) {
                    $distancia = $this->distanciaCoordenadaParadero($value['ngps_latitud'], $value['ngps_longitud'], $paradero1);
                    if ($distancia > $distanciaMinima) {
                        $cerca = 0;
                        break;
                    }
                    $distanciaPromedio = $distanciaPromedio + $distancia;
                }
                $distanciaPromedio = $distanciaPromedio / 3;
                if ($cerca == 1) {
                    $arrayPosibles[$contadorPosibles]['paradero1'] = $paradero1;
                    $arrayPosibles[$contadorPosibles]['paradero2'] = 0;
                    $arrayPosibles[$contadorPosibles]['dah'] = $dah;
                    $contadorPosibles++;

                    $arrayRespuesta['paradero1'] = $paradero1;
                    $arrayRespuesta['paradero2'] = 0;
                    $arrayRespuesta['distancia'] = $distanciaPromedio;
                    $arrayRespuesta['distanciaP1'] = $dp1p2;
                }
            } else {
                $coordenadasAjustadas = $this->coordendasAjustadas($paradero1, $siguienteParadero, $latitud, $longitud);
                $latitudAjustada = $coordenadasAjustadas['latitud'];
                $longitudAjustada = $coordenadasAjustadas['longitud'];
                $dp1p2 = $this->distanciaParaderos($paradero1, $siguienteParadero);
                $dhp1 = $this->distanciaCoordenadaParadero($latitudAjustada, $longitudAjustada, $paradero1);
                $dhp2 = $this->distanciaCoordenadaParadero($latitudAjustada, $longitudAjustada, $siguienteParadero);
                $dah = $this->distanciaAproximadaPuntos($latitud, $longitud, $latitudAjustada, $longitudAjustada);
                if ($dp1p2 < $dhp1 || $dp1p2 < $dhp2) {
//                   echo "Paradero $contadorPosibles: $paradero1 <br/>";
//                   echo "dp1p2:$dp1p2<br/>";
//                   echo "dhp1:$dhp1<br/>";
//                   echo "dhp2:$dhp2<br/>";
//                   echo "dah:$dah<br/>";
                } else {
//                   echo "Paradero $contadorPosibles: $paradero1 <br/>";
//                   echo "dah: $dah<br/>"; 
                    if ($dah < 0.1) {
                        $arrayPosibles[$contadorPosibles]['paradero1'] = $paradero1;
                        $arrayPosibles[$contadorPosibles]['paradero2'] = $siguienteParadero;
                        $arrayPosibles[$contadorPosibles]['dah'] = $dah;
                        $contadorPosibles++;
                    }
                }
            }
            $paradero1 = $siguienteParadero;
        }

        $numeroPosibles = count($arrayPosibles);
        $idElegido = 0;
        if ($cerca == 1) {
            $arrayRespuesta['estadoEnRuta'] = 1;
        } else {
            if ($numeroPosibles > 0) {
                $dahmin = $arrayPosibles[0]['dah'];
                foreach ($arrayPosibles as $key => $value) {
                    if ($dahmin > $arrayPosibles[$key]['dah']) {
                        $idElegido = $key;
                        $dahmin = $arrayPosibles[$key]['dah'];
                    }
                }
                $arrayRespuesta['estadoEnRuta'] = 1;
                $arrayRespuesta['paradero1'] = $arrayPosibles[$idElegido]['paradero1'];
                $arrayRespuesta['paradero2'] = $arrayPosibles[$idElegido]['paradero2'];
                $arrayRespuesta['distancia'] = $this->distanciaCoordenadaParadero($latitud, $longitud, $arrayRespuesta['paradero2']);
                $arrayRespuesta['distanciaP1'] = $this->distanciaCoordenadaParadero($latitud, $longitud, $arrayRespuesta['paradero1']);
            } else {
                $arrayRespuesta['estadoEnRuta'] = 0;
            }//fin if numero posibles
        }


        return $arrayRespuesta;
    }

// fin funcion
}

